﻿// 18-4如何构建基类.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

class A {
public:
    int m_a;
private:
    int m_b;
public:
    A():m_a(0),m_b(0)
    {
        cout << "调用了基类的默认的构造函数A()" << endl;
    }
    A(int a, int b) :m_a(a),m_b(b)
    {
        cout << "调用了基类的A(int a, int b)构造函数" << endl;
    }
    //A的拷贝构造函数
    A(const A& a):m_a(a.m_a + 1),m_b(a.m_b + 1)
    {
        cout << "调用了基类的A的拷贝构造函数A(const A& a)" << endl;
    }
    //显示基类的所有成员
    void showA() {
        cout << "m_a=" << m_a << ",m_b=" << m_b << endl;
    }
};
class B :public A {
public:
    int m_c;
    B() :m_c(0), A()//派生类的默认构造函数,指明使用基类的默认构造函数
    {
        cout << "调用了派生类的默认的构造函数B()" << endl;
    }
    B(int a, int b, int c) :A(a, b), m_c(c)
    {
        cout << "调用了派生类的默认的构造函数B(int a, int b, int c)" << endl;
    }
    B(const A& a, int c) :A(a), m_c(c)
    {
        cout << "调用了派生类的默认的构造函数B(const A& a, int c)" << endl;
    }
    void showB()
    {
        cout << "m_c=" << m_c << endl;
    }
};

int main()
{
    //调用基类默认的构造函数
    B b1;
    b1.showA();
    b1.showB();
    
    cout << "-------------------" << endl;

    B b2(1, 2, 3);//将调用基类两参数的构造函数
    b2.showA();
    b2.showB();

    cout << "-------------------" << endl;
    A a3(10, 20);
    B b3(a3, 30);
    b3.showA();
    b3.showB();

    /*
    调用了基类的默认的构造函数A()
    调用了派生类的默认的构造函数B()
    m_a=0,m_b=0
    m_c=0
    -------------------
    调用了基类的A(int a, int b)构造函数
    调用了派生类的默认的构造函数B(int a, int b, int c)
    m_a=1,m_b=2
    m_c=3
    -------------------
    调用了基类的A(int a, int b)构造函数
    调用了基类的A的拷贝构造函数A(const A& a)
    调用了派生类的默认的构造函数B(const A& a, int c)
    m_a=11,m_b=21
    m_c=30
    */
}

